跳到主要内容

Create by fall on 29 Dec 2020 Recently revised in 10 Feb 2025

P.S. 本章节只讲述在命令行中的使用

Shell命令行

A Unix shell is both a command interpreter and a programming language.

Unix shell 既是命令解释器,也是编程语言(命令行能用,也能用来编程)。

所有用于解析用户命令,并交给操作系统执行的应用程序,都可以称之为 shell。它有如下特点:

  • 简单,体积小。换个角度看,就是低级,不方便。
  • Unix / Linux 内置,几乎没有环境依赖。
  • 擅长系统操作密集任务,无法胜任计算密集的任务。

linux 操作系统中常见的 shell

  • sh:一般情况下是系统的默认 shell。
  • bash: 在 sh 的基础上增加了一些实用特性,是使用最广泛的 shell。(git bash

shell 和 bash 的区别?

执行用户输入内容的,都可以统称为 shell,因此bash 可以算作一个 shell,解析用户命令,并交给操作系统执行

可以在 linux 中直接输入 shbash 切换命令

可以做什么

  • 自动化批量部署系统初始化(统一进行设置,时间,安全策略初始化)
  • 自动化批量部署程序(软件安装 lamp lnmp ngnix)
  • 管理应用程序(kvm 集群管理扩容 缩容 mysql DELL720 批量 RAID)
  • 日志分析处理程序(PV UV 200 !200 top 10 grep/awk)
  • 自动化备份及数据恢复(mysql 安全备份 / 增量备份 crond)
  • 创建代码管理工具,备份代码。
  • 自动化信息采集(收集系统 / 应用服务状态信息 CPU EM NETWORK TCP APACHE NGINX MYSQL)【配合zabbix】
  • 自动化管理程序(批量远程修改密码,软件升级,配置更新)
  • 自动扩容以及减容(阿里云支持增加 / 删除云主机)对重要的应用服务进行调换机器。A--B 避免流量损失

将传统意义上的运维变为自动化,更高效及准确的完成任务,确保公司线上业务的稳定,减少人为干预的风险。

bash 命令

命令格式:命令 [操作] [参数]

多个选项书写方法:ls -la

命令查询和提示

  • type:查看某个系统命令是否存在,以及执行的到底是哪一个位置的命令
  • which:查看某个系统命令是否存在,以及执行的到底是哪一个位置的命令

命令行操作

  • clear:清空命令行
  • pwd:(print work directory):显示当前所在路径
  • cd:(change directory):切换路径,可以使用相对路径,也可用绝对路径
  • ls:(list files):显示当前目录所有文件和文件夹。
  • exit:退出命令行

命令简化:ll == ls -l(两个书写方式等价)

# 切换到 e 盘
cd /e
# 进入当前路径下的 fall 目录内
cd ./fall # ./ 可以省略,等价于 cd fall
# 进入根目录 home
cd ~
# 进入上一级目录
cd ..

ls

# 列出所有文件和文件夹,包括隐藏的文件夹
ls -a
# 以长格式显示文件和文件夹,长格式显示多种信息(文件型态、修改时间,权限,文件大小)
ls -l # 等价于 ll
# 将文件根据建立时间先后的顺序列出
ls -r
# 连同子目录的内容一起列出(递归列出),即该目录下的所有文件都会显示
ls -R

文件操作

  • touch:创建文件,如果已经存在,则更新修改时间
  • mkdir:创建文件夹
  • find:在指定的目录下查找文件。功能非常强大,参数比较多,需要重点掌握
    • find ./ -name "*.md":列出当前目录及其子目录下所有后缀为 .md 的文件。
  • du(disk usage):显示文件,或者目录夹占用空间大小(占用空间和大小是两回事)
    • -s:仅显示总数
    • -h:以 KMG 为单位
  • cp(copy):把文件或者文件夹复制到另一个文件中
    • -r:递归复制,用于目录的复制
    • -f:覆盖已经存在的目标文件并且不提示
    • -a:将文件的特性一起复制
  • rm(remove):删除文件或文件夹
    • -i:删除前询问确认是否删除
    • -r:递归删除,目录下的文件也全部删除
    • -f:force,忽略警告、不存在的文件,强制删除
  • mv(move file)移动文件
    • -f:文件同名,不会询问,直接覆盖旧文件。
    • -i:目录或文件同名,则会先询问是否覆盖旧文件,输入 y 表示直接覆盖,输入 n 表示取消该操作。
    • -b:目标文件或目录存在时,在执行覆盖前,会为其创建一个备份。
    • -u:当源文件比目标文件新或者目标文件不存在时,才执行移动操作。
  • ln(link files):为某一个文件在另外一个位置建立一个同步的链接,分硬链接和软链接。
    • 硬链接的意思是一个档案可以有多个名称(包括路径)
    • 软链接的方式则是产生一个特殊的内容,该内容指向原档案的位置。
    • 最后一个硬连接失效时,相当于文件从硬盘中移除
    • 软连接源文件移除,则文件从硬盘中移除,与软链接引用无关
  • dd:从指定文件读取数据写到指定文件

rm -rf /*(删除所有文件和文件夹)执行后,可以跑路了。

# 创建 test.sh 文件
touch test.sh
# 查看 test.sh 文件
cat test.sh
# 删除 test.sh 文件
rm test.sh
# 创建名为 fall 的文件夹
mkdir fall
mkdir -p ~/fall/zhang # 同时创建 ~/fall 以及 ~/fall/zhang 两个文件夹
# 进入名为 fall 的文件夹内
cd fall
# 查看文件的大小
du test.sh -sh

文件查看

  • cat:查看整个文件(适用文件小的场景)
  • less:从前向后查看文件代码
    • enter:显示下一行
    • 空格:点击空格键,显示下一页
    • q:退出文件检索
  • grep:用于查找文件里符合条件的字符串。一般用于定位关键词,例如 error
    • -v 排除匹配结果,打印出不符合条件行的内容
    • -n 显示匹配行和行号
    • -i 不区分大小写
    • -c 只统计匹配的行数
    • o:只显示匹配的字符串本身
  • wc:计算文件的 Byte 数、字数、或是列数。
    • -c:显示Bytes数
    • -l:显示行数
    • -w:显示字数
  • vim:打开文本编辑器(详见 VIM)。
  • find:查看路径下所有文件和文件夹,并输出所有子文件,或者检查是否存在

示例:

# 一次显示所有文本
cat test.sh
# 读取部分文本
less test.sh
# 从开头读取部分文本
head test.sh
# 从结尾读取部分文本
tail test.sh
# 查找 test.sh 中的 cd
grep "cd" 2.1-Shell命令行.md -i -n
# 查看 dir 路径下所有文件和文件夹
find dir

判断文件是否存在

-e 判断对象是否存在
-d 判断对象是否存在,并且为目录
-f 判断对象是否存在,并且为常规文件
-L 判断对象是否存在,并且为符号链接
-h 判断对象是否存在,并且为软链接
-s 判断对象是否存在,并且长度不为0
-r 判断对象是否存在,并且可读
-w 判断对象是否存在,并且可写
-x 判断对象是否存在,并且可执行
-O 判断对象是否存在,并且属于当前用户
-G 判断对象是否存在,并且属于当前用户组
-nt 判断 file1 是否比 file2 新 [ "/data/file1" -nt "/data/file2" ]
-ot 判断 file1 是否比 file2 旧 [ "/data/file1" -ot "/data/file2" ]

系统相关

  • reboot:重启
  • halt:关机
  • shutdown:关机或者重启
    • -h 关机、-r 重启
  • ps(process status):显示当前进程的状态
    • -A:列出所有的进程
    • -w:显示较多的内容
    • -au-aux:显示较详细的资讯、所有包含其他使用者的行程
    • ps -ef :查看所有进程
  • kill:关闭进程
    • 1:重新加载进程
    • 9:杀死一个进程
    • 15:正常停止一个进程。
# 查看 Linux 内核版本
uname -r
uname -a
# 查看磁盘空间大小和剩余空间
df
# 显示已经运行时间
uptime
# 获取提示
man [operation]
# 查看内存:(Mem:内存大小;Swap:虚拟内存大小)
cat /proc/cpuinfo
# 重启
shutdown -r now
# 关机
shutdown -h now

进程管理

systemctl 命令:systemctl <command> <unit>

command 常用的类型有以下几个

  • start 启动后面的 unit
  • stop 立刻关闭后面的 unit
  • restart 立刻重启后面的 unit
  • reload 不关闭的情况下重新载入配置
  • enable:下次开机时,自动启动
  • disable:下次开机时,关闭自启动
  • status:进程的状态

除此之外还有 mask 注销(无法再启动该 unit), unmask 撤销注销,is-active 有没有正在运行,is-enable 有无默认要启动,kill 向进程发送信号,show 列出 unit 配置

# 启动 docker
systemctl start docker
# 重启 docker
systemctl restart docker
# 关闭 docker
systemctl stop docker
# 不关闭的情况下,重新载入配置文件,让设置生效。
systemctl reload docker
# 查看 docker 进程的状态
systemctl status docker

网络相关

  • ping(IP 或者域名):查看是否能连接上
  • netstat(查看网络端口号)
    • -nlptu
  • curl
  • ip route show:查看当前设备的 IP
# 查看是否连接得到 www.github.com
ping www.github.com
# 显示和设置系统的主机名称
ping hostname

修改主机名和 IP 地址的映射:/etc/hosts

我们远程连接的时候用的是 ssh 协议

抓取网页内容,部署项目到 tomcat,或者部署 web 项目

curl www.example.com

用户管理

linux 在管理权限时,分成用户和组的概念(用户和组的关系是多对多)

  • 任何用户都属于某个或者某几个组

  • 一个组内包含多个用户

命令

  • who:查看当前服务器用户列表
  • whoami:当前用户名
  • adduser:添加用户,需要 root 权限
  • id:显示用户的 UID 和 GID
  • password:配置密码
  • su(switch user):切换用户
    • susu - 的区别是 su 只切换了身份,shell 环境仍然是普通用户,su - 连环境也一起切换
  • userdel:删除用户
    • -r:home 路径下的文件夹都没文件权限了
useradd zhangsan
password zhangsan
userdel zhangsan
# 删除张三用户

sudo su - 切换到 root 用户
echo  $path 输出可以使用的环境变量

文件权限

使用命令:ll 即可查看当前目录下所有文件的权限

ll
# -rwxr-xr-x 1 19852 197121 19 12月 4 17:21 test.sh*
# -rwxr-x--x 该内容表示权限

第一个字母是文件的类型,然后每三个进行分割,分别是

  • 文件所有者的权限(rwx
  • 文件所属组的权限(r-x
  • 其他用户的权限(--x

三个字母分别表示对应的权限:

  • r:可以读取文件
  • w:可以向文件中写入内容
  • x:执行该文件的权限

也会用二进制,或者是仅用数字表示对应权限

原表示法二进制表示转化为数字
rwx1117
r-x1015
--x0011

修改权限

chmod [ugoa] [+-=] [rwx]

权限修改对象:

  • u: 拥有者
  • g:拥有组
  • o:其他人
  • a:所有人,以上三者

权限更改方式

  • +:添加
  • -:删除
  • =:赋值
# 为 1.txt 的拥有者添加执行的权限
chmod u+x 1.txt
chmod g+rwx 1.txt
# 为 myApp 文件夹添加权限
chmod 777 myApp

软件安装

apt-get install zsh

wget

wget http://down.qq.com/lol/dltools/LOL_V4.2.1.1_FULL_0_tgod_signed.exe
-V, --version # 显示 wget 的版本后退出
-h, --help # 打印语法帮助
-b, --background # 启动后转入后台执行
-e, --execute=COMMAND # 执行 ".wgetrc" 格式的命令,wgetrc格式参见/etc/wgetrc或~/.wgetrc

命令行上传,下载

查看 yum 仓库

yum repolist all

rz 选中文件打开

sz 文件名

绿色版.zip 文件解压直用)

下载 .tar -> 解压 -> 使用

RPM(RedHat Package Management)

  • rpm -qa 查询
  • rpm -qa | grep java 筛选查询结果
  • rpm -e

安装:

rpm -ivh [xxx].rpm

-i 表示安装,-v 表示详细输出,-h 表示显示安装进度。

压缩解压

tar(tape archive ):备份压缩解压文件。

# 常用参数:
# -c:建立压缩档案/创建压缩包
# -x:解压
# -t:查看内容
# -r:向压缩归档文件末尾追加文件
# -u:更新原压缩包中的文件
# -f:使用档案名字/执行压缩包文件/解压那个文件
# -z:压缩方式
# -v:显示压缩信息/显示解压过程
# -C:解压位置

压缩

tar -zcvf java.tar.gz 1.txt 2.txt movie

查看

  • tar -tf java.tar.gz

解压

  • tar -xvf java.tar.gz 解压到当前文件夹内
  • tar -xvf ./java.tar.gz -C ./java 解压到 ./java 文件夹内

全局变量

一般来讲,全局变量需要进行配置,配置放在当前用户下的 ~/.bashrc

~/ 表示当前用户路径

以 node 为例来配置全局文件

  • 如果需要,先解压文件
  • 然后将文件移动到 bin 目录下 sudo mv node-v14.17.0 /usr/local/node
  • ~/.bashrc 中添加 export PATH=$PATH:/usr/local/node/bin
  • 然后运行 source ~/.bashrc
  • 验证安装 node -v

命令历史

Bash 会记录用户执行过的历史命令,保存在 ~/.bash_history 中,默认保存最近 500 条。

history 命令可以查看历史命令。

历史命令可以方便重复执行。最常用的是上下方向键浏览之前的命令。除此之外,利用 ! 运算符的历史展开(history expansion)功能,可以快速选取特定命令执行。

  • !!:指代上一条命令。
  • !-n:指代前 n 条命令,比如 !-1 即表示 !!
  • !n:指代 history 列出的命令中行号为 n 的命令。

除了命令,还能指代上一条命令的参数:

  • !$:上一个命令的最后一个参数。
  • !*:上一个命令的所有参数。
mkdir long-dir-name
cd !*
# 回车后,展开为 cd long-dir-name

还有一个非常实用的功能:根据关键字查找最近执行的命令,称为 reverse-i-search。按下快捷键 Ctrl + R,出现提示后,输入关键字,会匹配出历史中最近的一个命令。此时,回车可以立即执行,再按 Ctrl + R 会继续向上搜索。

命令别名

别名(alias)可以把一个命令(及其一部分参数)定义为一个新命令。利用别名,用户简化一些常用的命令,大大减少常用命令的键击。

alias 命令用于创建别名:

alias ll='ls -al'
# ll 会被替换成 ls -al 执行
ll
# ls 原来的参数也可以正常支持
ll -d my-dir

alias 创建的别名只在当前会话有效,重启终端后,别名就不存在了。如果希望创建一个持久化的别名,可以在 shell 的配置文件中加入别名声明。bash 的配置文件是 ~/.bashrc

~/.bashrc

# ...
# Aliases
# alias alias_name="command_to_run"

# Long format list
alias ll="ls -al"

每次启动时,shell 都会读取该配置进行初始化,这些别名就可以使用了。

获取帮助

help 能够显示内置命令的用法。

help type
# type: type [-afptP] name [name ...]
# Display information about command type.
# ...

help ls
# bash: help: no help topics match `ls'.

man 查看使用手册(过时的文档格式,因使用广泛一般会有用)

大部分命令会带有使用手册(manual page)介绍命令的语法和详细的作用

man ls

info 能支持超链接的 info 格式提供帮助文档

apropos 能够根据关键字搜索出相关的命令。

apropos rename file

help 查看命令行提供的帮助

VIM

vim 文本编辑器,广泛用于程序开发和文本编辑(纯命令行的文本编辑器,强调键盘操作,而不是鼠标)

打开文件:vim filename

  • 普通模式:用于导航和执行命令。启动 vim 时默认进入此模式。
  • 插入模式:用于文本输入。按 i 进入插入模式,按 Esc 返回普通模式。
  • 命令模式:用于执行命令。按 : 进入命令模式。

三种模式:编辑模式(o i)、命令模式(进入后默认)、行末模式(set nu)

命令模式

  • 保存文件:在命令模式下输入 :w 并按 Enter
  • 退出Vim:在命令模式下输入 :q 并按 Enter。如果未保存更改,可以使用:q!强制退出。
  • 保存并退出:在命令模式下输入 :wq 并按 Enter
  • 另存为:w filename 另存为文件

文本编辑

  • 插入文本:按i进入插入模式,输入文本后按Esc返回普通模式。
  • 删除字符:在普通模式下,按x删除光标下的字符。
  • 撤销操作:在普通模式下,按u撤销上一步操作。

导航

  • 上下左右移动:使用箭头键或h(左)、j(下)、k(上)、l(右)进行移动。
  • 跳转到行首/行尾:按0跳转到行首,按$跳转到行尾。
  • 跳转到特定行:在命令模式下输入:行号(例如:10跳转到第10行)。

查找和替换

  • 查找:在命令模式下输入 /keyword 并按 Enter,使用 n 查找下一个匹配项。
  • 替换:在命令模式下输入 :%s/旧词/新词/g 进行全局替换。

可以通过编辑 ~/.vimrc 文件来配置 vim,添加插件以扩展功能。

快捷键

Tab:自动补全,支持文件、命令、参数、用户名、主机名等。两次 Tab 可列出所有可选的自动补全项。

Ctrl + A/E: 移动到行首/尾。

Ctrl + U/K: 清除光标位置到行首/尾的字符。

Ctrl + C: 中止正在执行的命令。

Ctrl + L: 清空 shell 打印内容。同命令 clear。

Ctrl + D: 关闭 shell 会话。

命令语法

文档上会给出一些命令的使用方式,读懂给出的命令使用方式很重要

git push [--all | --mirror | --tags] [--follow-tags] [--atomic] [-n | --dry-run] [--receive-pack=<git-receive-pack>]
[--repo=<repository>] [-f | --force] [-d | --delete] [--prune] [-v | --verbose]
[-u | --set-upstream] [-o <string> | --push-option=<string>]
[--[no-]signed|--signed=(true|false|if-asked)]
[--force-with-lease[=<refname>[:<expect>]] [--force-if-includes]]
[--no-verify] [<repository> [<refspec>…]]

具有特定意义的符号:

  • [] 表示可选的部分,可以嵌套。
  • | 表示左右两边互斥。
  • < > 表示需要被实际内容替换的部分。
  • ... 表示可以存在多个值。

命令运算符

运算符含义
;顺序执行命令,即使上一条命令执行失败了(退出码非 0),也不会因为出错而终止。
&&把几个命令的逻辑组合在一起,前面的命令执行成功(退出码为 0),才执行后面的命令
`
``
&表示启动一个子 shell 进程在后台异步执行这个命令,结果输出到当前 shell。
{}可以把几个代码放到一个相同的执行上下文中。但并不影响变量作用域
一般见于函数声明处。还有一个场景是实现多条命令的重定向
# 分别创建三个文件夹
mkdir what; mkdir vue; mkdir react
# 创建文件夹,创建成功后再进入
mkdir fall && cd fall
# 如果为 true,执行 true,否则执行 false
true && echo true || echo false

# history 返回数百条用户历史命令
# grep 匹配出只带有"echo"单词的历史
# less 会将过滤后的历史以滚动查看的方式展示
history | grep "echo" | less

# 命令 1,2 在后台运行,3 在前台运行
# 可以用来同时启动多个任务。
command1 & command2 & command3

# 如果去掉大括号,重定向的优先级更高,只会影响 cat 命令。
{ echo "file content: "; cat source_file } > target_file

参考文章

作者链接
ICer消食片https://zhuanlan.zhihu.com/p/455678992
czpcalmhttps://juejin.cn/post/7130982053528469511
华东师范大学linux教程